/**
 * @author taowei20061122@163.com
 *
 * 2013-4-29 下午11:29:48
 */
package study.designpattern.facade;

import study.designpattern.facade.impl.AModuleImpl;
import study.designpattern.facade.impl.BModuleImpl;
import study.designpattern.facade.impl.CModuleImpl;

/**
 * 外观类Facade
 * 
 * 场景问题：代码生成的应用：如何才能让子系统外部的客户端在使用子系统的时候，既能简单地使用这些子系统内部功能模块，
 *     而又不用客户端去与子系统内部的多个模块交互呢？
 * 解决方案：外观模型：Facade封装了外部和子系统内部多个模块之间的交互过程，从而简化了外部的调用。
 *     通过Facade子系统为外部提供一些高层的接口，以方便他们的使用。 
 * 
 * 外观模式的本质：封装交互、简化调用
 * 
 * 何时选用外观模式：
 *    1.希望为一个复杂的子系统提供一个简单接口的时候；使用外观对象来实现大部分客户需要的功能，从而简化客户的使用；
 *    2.想要让客户程序和抽象类的实现部分松散耦合，从而提供子系统的独立性、可移植性和扩展性；
 *    3.如果构建多层结构的系统，可以考虑使用外观模式，使用外观对象作为各层的入口，简化层间调用，松散层次间的依赖关系；
 * 
 * @author taowei20061122@163.com
 *
 * 2013-4-29 下午11:29:48
 */
public class Facade {
	/**
	 * 示意方法，满足客户需要的功能
	 */
	public void test() {
		//在内部实现的时候可能调用内部的多个模块
		AModuleApi a = new AModuleImpl();
		a.testA();
		
		BModuleApi b = new BModuleImpl();
		b.testB();
		
		CModuleApi c = new CModuleImpl();
		c.testC();
	}
}
